home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 10
/
AACD 10.iso
/
AACD
/
Online
/
SpeakFreely
/
src
/
lpc10
/
placea.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-18
|
4KB
|
145 lines
/************************************************************************
*
* PLACEA Version 48
*
************************************************************************/
#include "lpcdefs.h"
#define lrange (AF-2)*LFRAME + 1
#define hrange AF*LFRAME
placea( ipitch, voibuf, obound, vwin, awin, ewin)
int obound;
int ipitch, voibuf[2][AF+1];
int vwin[2][AF], awin[2][AF], ewin[2][AF];
{
/* Local variables and parameters */
int i, j, k, l;
short ephase, winv;
static short allv;
int temp;
/* Place the Analysis window based on the voicing window
* placement, onsets, tentative voicing decision, and pitch.
*
* Case 1: Sustained Voiced Speech
* If the five most recent voicing decisions are
* voiced, then the window is placed phase-synchronously with the
* previous window, as close to the present voicing window if possible.
* If onsets bound the voicing window, then preference is given to
* a phase-synchronous placement which does not overlap these onsets.
*
* Case 2: Voiced Transition
* If at least one voicing decision in AF is voicied, and there are no
* onsets, then the window is placed as in case 1.
*
* Case 3: Unvoiced Speech or Onsets
* If both voicing decisions in AF are unvoiced, or there are onsets,
* then the window is placed coincident with the voicing window.
*
* Note: During phase-synchronous placement of windows, the length
* is not altered from MAXWIN, since this would defeat the purpose
* of phase-synchronous placement.
* Check for case 1 and case 2 */
allv = (voibuf[1][AF-2] == 1)?1:0;
allv = (allv && voibuf[0][AF-1] == 1)?1:0;
allv = (allv && voibuf[1][AF-1] == 1)?1:0;
allv = (allv && voibuf[0][AF ] == 1)?1:0;
allv = (allv && voibuf[1][AF ] == 1)?1:0;
winv = (voibuf[0][AF ] == 1 || voibuf[1][AF ] == 1)?1:0;
if (allv || (winv && (obound == 0))) {
/* APHASE: Phase synchronous window placement.
* Get minimum lower index of the window. */
i = (lrange + ipitch - 1 - awin[0][AF-2]) / ipitch;
i = i * ipitch;
i = i + awin[0][AF-2];
/* L = the actual length of this frame's analysis window. */
l = MAXWIN;
/* Calculate the location where a perfectly centered window would start. */
k = (vwin[0][AF-1] + vwin[1][AF-1] + 1 - l) * 0.5;
/* Choose the actual location to be the pitch multiple closest to this. */
temp = (float)((float)((float)(k - i) / (float)ipitch) + .5);
awin[0][AF-1] = i + temp * ipitch;
awin[1][AF-1] = awin[0][AF-1] + l - 1;
/* If there is an onset bounding the right of the voicing window and the
* analysis window overlaps that, then move the analysis window backward
* to avoid this onset. */
if (obound >= 2 && awin[1][AF-1] > vwin[1][AF-1]) {
awin[0][AF-1] -= ipitch;
awin[1][AF-1] -= ipitch;
}
/* Similarly for the left of the voicing window. */
if ((obound == 1 || obound == 3) && awin[0][AF-1] < vwin[0][AF-1]) {
awin[0][AF-1] += ipitch;
awin[1][AF-1] += ipitch;
}
/* If this placement puts the analysis window above HRANGE, then
* move it backward an integer number of pitch periods. */
while (awin[1][AF-1] > hrange) {
awin[0][AF-1] -= ipitch;
awin[1][AF-1] -= ipitch;
}
/* Similarly if the placement puts the analysis window below LRANGE. */
while (awin[0][AF-1] < lrange) {
awin[0][AF-1] += ipitch;
awin[1][AF-1] += ipitch;
}
/* Make Energy window be phase-synchronous. */
ephase = 1;
/* Case 3 */
}
else {
awin[0][AF-1] = vwin[0][AF-1];
awin[1][AF-1] = vwin[1][AF-1];
ephase = 0;
}
/* RMS is computed over an integer number of pitch periods in the analysis
* window. When it is not placed phase-synchronously, it is placed as close
* as possible to onsets. */
j = ((awin[1][AF-1]-awin[0][AF-1]+1)/ipitch)*ipitch;
if (j == 0 || !winv) {
ewin[0][AF-1] = vwin[0][AF-1];
ewin[1][AF-1] = vwin[1][AF-1];
}
else
if (!ephase && obound == 2) {
ewin[0][AF-1] = awin[1][AF-1] - j + 1;
ewin[1][AF-1] = awin[1][AF-1];
}
else {
ewin[0][AF-1] = awin[0][AF-1];
ewin[1][AF-1] = awin[0][AF-1] + j - 1;
}
}